#!/usr/bin/env node

/**
 * 测试定时任务脚本
 * 用于验证日志清理定时任务功能
 */

const fs = require('fs');
const path = require('path');

const logsDir = path.join(__dirname, '../logs');
const testLogsDir = path.join(logsDir, 'test-schedule');

console.log('🧪 开始测试定时任务功能...');

// 创建测试日志文件
function createTestLogs() {
  console.log('📁 创建测试日志文件...');

  if (!fs.existsSync(testLogsDir)) {
    fs.mkdirSync(testLogsDir, { recursive: true });
  }

  const testFiles = [
    {
      name: 'old-debug.log',
      content: 'DEBUG: 这是一个旧的调试日志文件\n'.repeat(1000),
      age: 8 * 24 * 60 * 60 * 1000 // 8天前
    },
    {
      name: 'recent-info.log',
      content: 'INFO: 这是一个最近的信息日志文件\n'.repeat(100),
      age: 1 * 60 * 60 * 1000 // 1小时前
    },
    {
      name: 'error.log',
      content: 'ERROR: 这是重要的错误日志\n'.repeat(50),
      age: 5 * 24 * 60 * 60 * 1000 // 5天前
    },
    {
      name: 'large-log.log',
      content: 'DATA: '.repeat(20000), // 创建大文件
      age: 2 * 24 * 60 * 60 * 1000 // 2天前
    }
  ];

  testFiles.forEach(file => {
    const filePath = path.join(testLogsDir, file.name);
    fs.writeFileSync(filePath, file.content);

    // 设置文件的修改时间
    const oldTime = new Date(Date.now() - file.age);
    fs.utimesSync(filePath, oldTime, oldTime);

    const stat = fs.statSync(filePath);
    console.log(`✅ 创建测试文件: ${file.name} (${formatBytes(stat.size)})`);
  });
}

// 格式化字节数
function formatBytes(bytes) {
  if (bytes === 0) return '0 Bytes';

  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));

  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

// 清理测试文件
function cleanupTestFiles() {
  console.log('🧹 清理测试文件...');
  if (fs.existsSync(testLogsDir)) {
    const files = fs.readdirSync(testLogsDir);
    files.forEach(file => {
      fs.unlinkSync(path.join(testLogsDir, file));
    });
    fs.rmdirSync(testLogsDir);
    console.log('✅ 测试文件清理完成');
  }
}

// 检查文件状态
function checkLogStatus() {
  console.log('📊 检查日志文件状态...');
  if (!fs.existsSync(testLogsDir)) {
    console.log('📁 测试目录不存在');
    return;
  }

  const files = fs.readdirSync(testLogsDir);
  files.forEach(file => {
    const filePath = path.join(testLogsDir, file);
    const stat = fs.statSync(filePath);
    const age = Date.now() - stat.mtime.getTime();
    console.log(`📄 ${file}: ${formatBytes(stat.size)}, ${formatAge(age)}`);
  });
}

function formatAge(milliseconds) {
  const seconds = Math.floor(milliseconds / 1000);
  const minutes = Math.floor(seconds / 60);
  const hours = Math.floor(minutes / 60);
  const days = Math.floor(hours / 24);

  if (days > 0) return `${days}天前`;
  if (hours > 0) return `${hours}小时前`;
  if (minutes > 0) return `${minutes}分钟前`;
  return `${seconds}秒前`;
}

// 主函数
function main() {
  const command = process.argv[2];

  switch (command) {
    case 'create':
      createTestLogs();
      break;
    case 'check':
      checkLogStatus();
      break;
    case 'cleanup':
      cleanupTestFiles();
      break;
    case 'test':
      createTestLogs();
      console.log('\n📝 测试文件创建完成！');
      console.log('现在可以运行以下命令测试清理功能:');
      console.log('  npm run clear-logs');
      console.log('  node scripts/test-schedule.js check');
      break;
    default:
      console.log('用法: node test-schedule.js [create|check|cleanup|test]');
      console.log('  create  - 创建测试日志文件');
      console.log('  check   - 检查日志文件状态');
      console.log('  cleanup - 清理测试文件');
      console.log('  test    - 完整测试流程');
  }
}

if (require.main === module) {
  main();
}
